package com.zhongge.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

/**
 * @ClassName RealizeJDBC
 * @Description TODO 实现java连接数据库
 * @Author zhongge
 * @Version 1.0
 */
public class RealizeJDBC {
    public static void main(String[] args) throws Exception {
        //第一步：注册驱动
        /*
         * 使用的是：反射技术进行注册举动
         * 注意的是：他底层会调用一个静态代码块
         * 这个静态代码块里面就有注册驱动的代码.
         * 为什么需要注册驱动？？
         *      将厂商驱动实现类加载到 JVM
         *      将该驱动实例注册到 DriverManager
         *      使得后续调用 DriverManager.getConnection() 时，能自动匹配到正确的驱动。
         */
        Class.forName("com.mysql.cj.jdbc.Driver");//将mysql厂商实现的jdbc规范加载到我JVM中


        //第二步：获取数据库连接对象 ：将JVM和MySQL 这两个进程打通
        /**
         * Connection:连接-》conn（巧记）
         * DriverManager ：大妈 管得宽  所以是：DriverManager翻译为驱动管理器
         * DriverManager.getConnection();巧记为大妈 来找管道conn
         *
         * 要想让jvm和数据库打通，说白了就是说 要在本地java中去请求连接MySQL数据库
         * 那么MySQL数据库是一个服务器软件，哪一台硬件设备安装了他，那么这台设备可以看做是服务器
         * 然而在学习尚学堂的severlet我知道想要找一台服务器需要”IP地址“，需要访问服务器中的进程需要”端口号“
         * ，然后如果我们需要端口中的具体的某个文件的时候还需要uri即统一资源标识符也就是文件在当前端口下的路径
         * 这个就是URL，后面需要一些参数 可以自行选择。
         *
         * 现在：我已我本机为例：
         *  如何去连接我的数据库？
         *     1）我本机下载了MySQL那么说明我这台电脑逻辑上是一个服务机器，(他可以充当客户机和拂去器)
         *     2）我的MySQL中有一个数据库叫：mydb  这个数据库里面有一张表叫：dormlender
         *     3）现在我需要连接我的数据库：
         *      1.首先要有一个Java和MySQL之间连接的协议：jdbc:mysql://
         *      2.其次是先找到我的MySQL服务器所在的地方，由于MySQL被我装到了我的电脑上，那么我就是在连我的本主机。
         *      如果是我自己连自己那么此时的IP地址就是我的主机127.0.0.1或者使用域名localhost
         *      如果其他人连我自己的那么他就使用我的IP地址192.168.150.51
         *      url核心就是jdbc:mysql://127.0.0.1
         *      3.此时我要在我这台服务器上（就是我的电脑上）找到MySQL这个进程,那么我就得输入端口号3306
         *      综上url核心就是jdbc:mysql://127.0.0.1:3306
         *      4.此时我要找到mydb库下的dormlender表，所以uri即路径为mydb
         *          注意：
         *              表名不应在连接字符串中
         *              连接时只需指定数据库名（mydb），表名是在执行 SQL 时指定的（如 SELECT * FROM dormlender）。
         *              也就是说：URL 只需到数据库层级，表名通过 SQL 指定
         *      基本完整的URL为：jdbc:mysql://127.0.0.1:3306/mydb
         *      5.此时我们一般都是需要指定一些参数的参数与基本完整url之间使用?分开，后续的每一个参数之间使用&隔开
         *          为什么使用“?”分开 为了人家解析url的时候容易区分哪一些部分是参数部分
         *          目前你就写如下参数即可：useSSL=false&useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
         *          这些参数会在以后慢慢了解总结 反正现在就只需要照搬
         */
        String url = "jdbc:mysql://127.0.0.1:3306/mydb?useSSL=false&useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai";
        String useName = "root";
        String pwd = "123456";
        Connection conn = DriverManager.getConnection(url, useName, pwd);
        //第三步：获取数据库操作对象  就是拿到一把手枪 到时候顺着管道把子弹打过去
        Statement stm = conn.createStatement();
        //第四步：执行sql语句  sql语句就是子弹
        /**
         * 数据库操作对象stm就是手枪  手枪有一个功能executeQuery就是将子弹射出去的功能(即执行sql语句的方法)
         * Query翻译为查询
         */
        String sql = "select * from dormlender;";
        ResultSet rs = stm.executeQuery(sql);//结果会返回一个结果集ResultSet对象
        //第五步：处理查询结果集

        System.out.println("id" + "\t" + "name" + "\t" + "sex" + "\t" + "phone" + "\t\t" + "dormid");
        while (rs.next()) { //很想迭代器
            int id = rs.getInt("dlid");
            String name = rs.getString("NAME");
            String sex = rs.getString("sex");
            String phone = rs.getString("phone");
            String dormid = rs.getString("dormid");
            System.out.println(id + "\t" + name + "\t" + sex + "\t" + phone + "\t" + dormid);
        }
        //第六步：释放资源 :从后往前释放
        rs.close();
        stm.close();
        conn.close();

    }
}